LeetCode - 3 最长未重复子字符串

LeetCode 题库:https://github.com/SwiftCommunityRes/LeetCode–Swift

前言

我们社区从本期开始会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。微博:@故胤道长))的 Swift 算法题题解整理为文字版以方便大家学习与阅读。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。

难度水平:中等

1. 描述

给定一个字符串 s, 找出最长未重复的子字符串的长度.

2. 示例

示例 1

1
2
3
输入: s = "abcabcbb"
输出: 3
解释: 最长为重复的子字符串答案是 "abc", 长度为 3.

示例 2

1
2
3
输入: s = "bbbbb"
输出: 1
解释: 最长为重复的子字符串答案是 "b", 长度为 1.

示例 3

1
2
3
4
输入: s = "pwwkew"
输出: 3
解释: 最长为重复的子字符串答案是 "wke", 长度为 3.
注意答案必须是自字符串,“pwke” 是一个子列,而不是一个自字符串.

示例 4

1
2
输入: s = ""
输出: 0

3. 答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class LongestSubstringWithoutRepeatingCharacters {
func lengthOfLongestSubstring(_ s: String) -> Int {
var maxLen = 0, startIdx = 0, charToPos = [Character: Int]()
let sChars = Array(s)

for (i, char) in sChars.enumerated() {
if let pos = charToPos[char] {
startIdx = max(startIdx, pos)
}

// update to next valid position
charToPos[char] = i + 1
maxLen = max(maxLen, i - startIdx + 1)
}

return maxLen
}
}
  • 主要思想:使用字典存储非重复子字符串的下一个可能有效字符的位置,然后迭代字符串更新 maxLen、dictionary 和遇到重复时的 startIdx .
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

点击前往 LeetCode 练习

关于我们

公众号是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。欢迎关注公众号:Swift社区,后台点击进群,联系我们获取更多内容。

Swift社区

-------------本文结束感谢您的阅读-------------

本文标题:LeetCode - 3 最长未重复子字符串

文章作者:Swift社区

发布时间:2021年11月22日 - 14:11

最后更新:2022年08月25日 - 11:08

原始链接:https://fanbaoying.github.io/LeetCode - 3 最长未重复子字符串/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!